home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / endo / cmplx.c next >
C/C++ Source or Header  |  1995-05-03  |  3KB  |  125 lines

  1. /*************************************************************************
  2.  *                                                                       *
  3.  *  Copyright (c) 1992, 1993 Ronald Joe Record                           *
  4.  *                                                                       *
  5.  *  All rights reserved. No part of this program or publication may be   *
  6.  *  reproduced, transmitted, transcribed, stored in a retrieval system,  *
  7.  *  or translated into any language or computer language, in any form or *
  8.  *  by any means, electronic, mechanical, magnetic, optical, chemical,   *
  9.  *  biological, or otherwise, without the prior written permission of:   *
  10.  *                                                                       *
  11.  *      Ronald Joe Record (408) 458-3718                                 *
  12.  *      212 Owen St., Santa Cruz, California 95062 USA                   *
  13.  *                                                                       *
  14.  *************************************************************************/
  15.  
  16. #include <math.h>
  17. #include "defines.h"
  18.  
  19. void
  20. cmul(z, a, b, c, d)    /* complex multiplication */
  21. double a, b, c, d;
  22. pair *z;
  23. {
  24.     z->x = (a*c) - (b*d);
  25.     z->y = (a*d) + (b*c);
  26. }
  27.  
  28. /*
  29.  * invert c; where:
  30.  *    1           1                      a           b
  31.  * --------  = ------- * (a - bi) = ( -------  -  ------- i )
  32.  * (a + bi)      2   2                  2   2      2    2
  33.  *              a + b                  a + b       a + b
  34.  */
  35. void
  36. cinv(z, a, b)    /* complex inversion 1 / (a + bi) */
  37. double a, b;
  38. pair *z;
  39. {
  40.     static double factor;
  41.  
  42.     factor = 1.0/(a*a + b*b);
  43.     z->x = a*factor;
  44.     z->y = -b*factor;
  45. }
  46.  
  47. void
  48. cdiv(z, a, b, c, d)    /* complex division (a + bi) / (c + di) */
  49. double a, b, c, d;
  50. pair *z;
  51. {
  52.     cinv(z, c, d);
  53.     cmul(z, a, b, z->x, z->y);
  54. }
  55.  
  56. void
  57. zbar(z, x, y)
  58. double x, y;
  59. pair *z;
  60. {
  61.     z->x = x;
  62.     z->y = -y;
  63. }
  64.  
  65. /*
  66.  * void
  67.  * zpow(z, x, y, n)    z^n for complex z = x + iy and integer n
  68.  * double x, y;
  69.  * pair *z;
  70.  * int n;
  71.  * {
  72.  *     static int i;
  73.  * 
  74.  *     if (n == 0) {
  75.  *         z->x = 1; z->y = 0;
  76.  *         return;
  77.  *     }
  78.  *     z->x = x; z->y = y;
  79.  *     if (n < 0) {
  80.  *         n = -n;
  81.  *         cdiv(z, 1.0, 0.0, x, y);
  82.  *     }
  83.  *     for (i=1; i<n; i++)
  84.  *         cmul(z, z->x, z->y, x, y);
  85.  * }
  86.  */
  87.  
  88. void
  89. zpow(z, x, y, n)    /* z^n for complex z = x + iy and real n */
  90. double x, y, n;
  91. pair *z;
  92. {
  93.     double logr, logi, a, b;
  94.     double log(), exp(), cos(), sin(), atan2(), sqrt();
  95.  
  96.     logr = log( sqrt(x*x+y*y) );
  97.     logi = atan2(y, x);
  98.  
  99.     a = exp( logr * n);
  100.     b = logi * n;
  101.  
  102.     z->x = a * cos(b);
  103.     z->y = a * sin(b);
  104. }
  105.  
  106. double
  107. rpzn(x, y, n)    /* real part of z^n for complex z = x + iy */
  108. double x, y, n;
  109. {
  110.     pair z;
  111.  
  112.     zpow(&z, x, y, n);
  113.     return(z.x);
  114. }
  115.  
  116. void
  117. cadd(z, a, b, c, d)    /* complex addition */
  118. double a, b, c, d;
  119. pair *z;
  120. {
  121.     z->x = a + c;
  122.     z->y = b + d;
  123. }
  124.  
  125.